热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PerlOneLiners|Perl命令行学习5$/和$\变量

Perl特殊变量$和$\上集回顾上次我们看了一下-M与-I这两个搭档这次我们来看看这两个特殊的”变量“$和$\,不是参数。解释$:输入记录分隔符$\:输出记录分隔符说实话,这两个符
Perl 特殊变量$/$\

上集回顾

上次我们看了一下-M-I这两个搭档
这次我们来看看这两个特殊的”变量“$/$\,不是参数。

解释

$/ : 输入记录分隔符
$\ : 输出记录分隔符

说实话,这两个符号的确是有些诡异!可以这么来记,“太阳出来我爬山坡,爬上山坡我好唱歌”,爬坡的是/(入),下坡的是\(出)。

这两个变量是特殊变量,什么意思呢?就是它们是从娘胎里来的,本来就有,不需要你去声明,它们就在那里。

为什么要说这两个变量呢?这两个变量是什么意思呢?下面先说明一下这两个奇特的怪物究竟是个什么玩意。

比如在工厂车间的流水线,生产罐头的那种。
[] [] [] [] [] [] [] [] [] [] [] []
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->
| O O O O O O O O O O O O O O O O |
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<-
当得到成品罐头之后,需要装箱了,可是多少个装一箱呢。
这个时候就有机器负责控制履带移动的长度来控制几个罐头为一组进行装箱(罐头之间间距相等)。
比如4个罐头装一箱,那好,当过了一定长度之后传送带停下来,机械臂将4个罐头装箱,OK
|===================
-
| |
|
[] [] [] [] [] [] [] [] [] [] [] []
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->
| O O O O O O O O O O O O O O O O |
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<-
下一批
|===================
- ---------
| | | [] [] |
| | [] [] |
[] [] [] [] [] [] [] [] ---------
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->--> ####################
| O O O O O O O O O O O O O O O O | ####################
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<- ####################
再下一批
|===================
- --------- ---------
| | | [] [] | | [] [] |
| | [] [] | | [] [] |
[] [] [] [] --------- ---------
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->--> ####################
| O O O O O O O O O O O O O O O O | ####################
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<- ####################

假如我的包装箱变大了,这次要装6个,怎么搞,好办,设置一下传送带每次传送的长度就OK可
|=================== ---------
- | [] [] |
| | | [] [] |
| | [] [] |
[] [] [] [] [] [] ---------
->-->-->-->-->-->-->-->-->-->-->-->-->-->-->-->--> ####################
| O O O O O O O O O O O O O O O O | ####################
<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<--<- ####################

有的时候厂家搞活动,在箱子里面除了有罐头,还有小礼品哟。
---------
| [] [] |--| +++
| [] [] | | +++ 小礼品,比如杯子,哈哈
| [] [] | +++
--------- +++
^^^^^^^^^^
||||||||||
上面是一个装罐头的箱子,外面用绳子系了个礼物在外面,我怕我灵魂画手的功力太深,你们认不出来~~

这里不妨把perl的文本处理流程当作是工厂中的流水线,每次读取一“行”,来处理。

  • $/就是说在什么地方将文本分隔开来作为一组”罐头“,类似于控制传送带移动的长度。
  • $\就是当我想打印文本的时候后面带的小尾巴是什么,就像是上面的小礼品一样。

现实世界与机器世界

《Perl One-Liners | Perl命令行学习5 $/和$\变量》 现实世界.JPG

《Perl One-Liners | Perl命令行学习5 $/和$\变量》 机器世界.JPG

平常我们读书,从左到右转头就是一行。但是在机器世界,究竟什么是“行”,其实计算机的存储是连续的,并不是说想现实世界那样还转行之类的。那么究竟是如何区分行与行呢?
比如有一段序列

ATGCGTAGCTA
TAGCTAGCTTG
AA

其实真实的是这样的

ATGCGTAGCTA\nTAGCTAGCTTG\nAA

当然了,更加还原是以1和0表示,这里为了方便叙述。也就是说在这三“行”序列之间是用一个\n连起来的,并不是像现实世界转头之类的。机器为了区分,每次读到\n,就知道了到了一“行”了。
上面两张图说明了现实的书本纸和机器世界的区别LF就是指\n。这个就是为了告诉机器要“换行了”。那么这里Perl不仅可以要机器在\n的地方换行,也可以自己设置如果碰到什么字符那就换行,比如!~@等等。

我之前有一个同学在处理文本的时候没有将末尾的那个不可见的换行符去除,导致正则表达式无法匹配,也就无法得到正确结果,但是他换成从命令行输出那一行信息却可以匹配(从命令行读取的不包含换行符)。一直纠结,后来我给他说了,他一直不相信,知道后来事实证明他没搞清楚这个换行符。

额,可能被我搞的糊涂了,来看看例子就明白啦!

用法

$/ = "\n";
$\ = "\n";

这两个就是变量,也就是说可以直接对他们赋值

实例

  • 示例1

# 这次不用-a与-F参数来处理
echo "12-34-56,45-23-67,678-56-12" | perl -n -e '
BEGIN{
# 在读取数据之前就设置好输入记录分隔符
# 设置 , 作为“一行”的结尾的标志
$/ = ",";
}
# 在将读取的每一“行”的一系列用 - 连起来的数值进行分隔
my @list = split /-/,$_;
# 对每组数值求和
my $total = 0; # 初始化变量
for my $num (@list){
$total += $num;
}
print "$total\n";
'
# 输出
102
135
746

这里来解释一下

| |
v v
12-34-56,45-23-67,678-56-12

箭头所指的就是每次读取的”一行“的停止位置,平常我们一般都是认为换行符才是一行的末尾,但是这里$/大哥说了,机器人的世界中的天上天下的——换行,都归我管 。也就是说这里它重新定义了行的概念,就是说,按照,来作为标志。比如

机器读
12-34-56,
这是”一行“
再读
45-23-67,
这是”一行“
在读
678-56-12
这是”一行“

这里的“行”是指机器读的行

来点实际的东西

  • 示例2

假如有一个文件123.txt,内容为

>atp1
AGTCAGCTGACTCGATCTACGTCTAGCGACGT
GATACGTACGTACGGTACTCGTAGCTACCGTA
TAGTAGC
>cox
ATGCGTAGCTATCGTAGCTAGCTCGATCGTCA
AGTAGCTCAGG
>nad1
ATGCTAGCTGACTTGACTGCATACGATGCTAG
GTAGTCATGCTAGCTAGC

其实在平常我们碰到很多fasta文件,它的序列是按照80个碱基为一行就进行了换行了,所以我们后续处理有些麻烦。比如我们想要得到名为atp1的序列,那么就是当我判断了到了atp1之后,接下来就是序列,可是只打印出>atp1下面的一行却不是它的完整序列,还需要继续打印,直到碰到>cox,这样其实某种程度上来说就有点不太方便。

怎么做呢?你根据今天说的内容应该想出来怎么办了吧!

# 使用 > 作为输入分隔符
# 代码如下
cat 123.txt | perl -n -e '
BEGIN{
$/ = ">";
}
# 由于是以 > 作为分隔符,那么尾巴处就可能有>符号(除了最后一行可能没有其他都有)
$_ =~ s/>$//; # 正则表达式中\s*\r*使因为不只知道在atp1后面是否有空格和回车符,所以加上
if($_ =~ m/^atp1\s*\r*\n/){
# 1. 也可以在这里除去里面的换行符
# print (substr($_,length($&)) =~ s/\r*\n//gr);
# 2. 也可以不去除
print ( substr($_,length($&) );
}
'
# 输出为
AGTCAGCTGACTCGATCTACGTCTAGCGACGT
GATACGTACGTACGGTACTCGTAGCTACCGTA
TAGTAGC

这里我把分隔出来的每一批字符写一下

  1. 第一批

>

  1. 第二批

atp1
AGTCAGCTGACTCGATCTACGTCTAGCGACGT
GATACGTACGTACGGTACTCGTAGCTACCGTA
TAGTAGC
>

  1. 第三批

cox
ATGCGTAGCTATCGTAGCTAGCTCGATCGTCA
AGTAGCTCAGG
>

  1. 第四批

nad1
ATGCTAGCTGACTTGACTGCATACGATGCTAG
GTAGTCATGCTAGCTAGC

注意:由于这里我们对机器世界的行进行了重新定义,在这每一“行”中就可能存在多个\n,而“行”的结尾就变成了>

$\

这个参数就是说当输出的时候,在输出的内容后带上一个小尾巴
比如

perl -e '
BEGIN{
$\ = "~";
}
for my $num (1..10){
print "$num";
}
'
# 输出
1~2~3~4~5~6~7~8~9~10~

就是说每次print,都会在print的内容后面加上$\指定的内容,这里是否想到减少按键盘的次数了。将$\赋值为\n。你自己多试一试哦。

后记

这一次并没有说参数相关的,而是说了这两个怪物,其实从第一篇再到这个第五篇,顺序是按照我个人认为的重要程度来述说的,有点主观啊!但是要是写的话就是说如果有一根线穿连着会不会更加有效一些。因为Perl特别擅长文本处理,而涉及到文本就不得不牵扯到换行啦,打印啦之类的。而这两个特殊变量就是与之相关的,虽然怪异但是这两个变量的确好用。对了,上面的例子都是搭配BEGIN{}和END{}搭配进行的全局的分隔符的设置,其实有时候可以使用local $/ = ">"local $\ = "\n",之类的写法来在局部块中进行设置。

相关

有关BEGIN{}END{}的说明已经在之前的内容中提到了。可以参见

  • perl命令行 -a与 -F参数
  • Perl命令行 -M与-I参数

引用

简笔画技法从新手到高手


推荐阅读
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 在网站制作中随时可用的10个 HTML5 代码片段
    HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
author-avatar
pS看云梦山水Tn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有